```python
from abc import ABC, abstractmethod
from typing import Optional

from pydantic import Field

from app.agent.base import BaseAgent
from app.llm import LLM
from app.schema import AgentState, Memory


class ReActAgent(BaseAgent, ABC):
    """
    ReActAgent 类，继承自 BaseAgent 和 ABC，用于实现 ReAct 模式的智能体。

    Attributes:
        name (str): 智能体的名称。
        description (Optional[str]): 智能体的描述信息，默认为 None。
        system_prompt (Optional[str]): 系统提示信息，默认为 None。
        next_step_prompt (Optional[str]): 下一步的提示信息，默认为 None。
        llm (Optional[LLM]): 大语言模型实例，默认为 LLM 的默认工厂函数。
        memory (Memory): 智能体的记忆实例，默认为 Memory 的默认工厂函数。
        state (AgentState): 智能体的状态，默认初始状态为 IDLE。
        max_steps (int): 最大执行步数，默认为 10。
        current_step (int): 当前执行步数，默认为 0。
    """
    name: str
    description: Optional[str] = None

    system_prompt: Optional[str] = None
    next_step_prompt: Optional[str] = None

    llm: Optional[LLM] = Field(default_factory=LLM)
    memory: Memory = Field(default_factory=Memory)
    state: AgentState = AgentState.IDLE

    max_steps: int = 10
    current_step: int = 0

    @abstractmethod
    async def think(self) -> bool:
        """
        抽象方法：处理当前状态并决定下一步的操作。

        Returns:
            bool: 如果需要执行操作，返回 True；否则返回 False。
        """
        """Process current state and decide next action"""

    @abstractmethod
    async def act(self) -> str:
        """
        抽象方法：执行决定的操作。

        Returns:
            str: 执行操作的结果。
        """
        """Execute decided actions"""

    async def step(self) -> str:
        """
        执行单个步骤：先思考后行动。

        Returns:
            str: 执行步骤的结果。
        """
        should_act = await self.think()
        if not should_act:
            return "Thinking complete - no action needed"
        return await self.act()
